package 设计模式.单例模式;

/*
* double-checked locking实现单例
* */
public class DoubleCheck {
   private volatile static DoubleCheck single;
   private DoubleCheck(){
       //初始化
   }
   public static DoubleCheck getSingle(){
       if(single==null){//如果不加双if检测 每次获取都要monitor 影响性能
           synchronized (DoubleCheck.class) {
               if(single==null){
                   /*17 new #3 <juc/jmm/Test4>
                    20 dup
                    21 invokespecial #4 <juc/jmm/Test4.<init> : ()V>
                    24 putstatic #2 <juc/jmm/Test4.single : Ljuc/jmm/Test4;>*/
                   single=new DoubleCheck();//对应上面的字节码指令 但是在运行过程中这些可能发生jvm层面的指令重排 导致外部获得一个没有调用invokespecial 的单例对象 加上volatile解决
               }
           }
       }
       return single;
   }
}
